perm filename SQRT.FAI[SYS,HE] blob sn#004207 filedate 1972-06-05 generic text, type T, neo UTF8
ENTRY SQRT
	TITLE SQRT ROUTINE UNTIL PUT IN SAIL LIBRARY

	A←13
	B←14
	P←17

SQRT:				;ENTRY TO SQUARE ROOT ROUTINE
	SKIPG	B,-1(P)		;PICK UP ARG. CHECK IF GREATER THAN 0
	JRST	SQRT4		;NO, HANDLE NON-POSITIVE ARGUMENT

	MOVEI	A,0		;GET EXPONENT TO A
	LSHC	A,=9
	SUBI	A,201		;GET TRUE EXPONENT + 1
	ROT	A,-1		;DIVIDE BY 2
	HRRM	A,SQRT2		;AND STORE FOR FLOATING SCALE INST.
	JUMPL	A,SQRT3		;JUMP IF FRACTION GREATER THAN .5

	LSH	B,=-9		;RESTORE POSITION OF FRACTION IN B
	FSC	B,177		;AND FIX UP EXPONENT .25 LESS THAN F LESS THAN .5
	MOVEM	B,F		;SAVE FRACTION
				;COMPUTE LINEAR APPROX #1
	FMPRI	B,200640
	FADRI	B,177465

SQRT1:	MOVE	A,F		;1ST ITERATION OF NEWTON
	FDV	A,B		; F/APPROX
	FAD	B,A		; APPROX  +  F/APPROX
	FSC	B,-1		; .5*( APPROX  +  F/APPROX)
	MOVE 	A,F		;2ND ITERATION OF NEWTON
	FDV	A,B		; F/APPROX
	FADR	A,B		; APPROX + F/APPROX
SQRT2:	FSC	A,0		;HALVE AND SCALE EXPONENT
	MOVE	1,A		;RESULT IN AC 1
	JRST	EXIT		;RETURN

				;HERE ON F GREATER THAN= .5
SQRT3:	LSH	B,=-9		;RESTORE POSITION OF FRACTION IN B
	FSC	B,200		;AND FIX UP EXPONENT .5 LESS THAN= F LESS THAN 1
	MOVEM	B,F		;SAVE FRACTION
				;COMPUTE LINEAR APPROX #2
	FMPRI	B,200450
	FADRI	B,177660
	JRST	SQRT1		;NOW GO ITERATE
SQRT4:	JUMPE	B,ZERO
	OUTSTR [ASCIZ /SQRT: NEGATIVE ARGUMENT - 0 RETURNED/];
ZERO:	MOVEI	1,0		;HERE ON NON-POSITIVE ARG. RETURN ZERO
EXIT:	SUB	P,[XWD 2,2]
	JRST	@2(P)

F:	BLOCK	1		;STORE FRACTION HERE
	END